﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IbsysII.Domain;
using System.Windows.Controls;

namespace IbsysII.Util
{
    class GUI_LOAD
    {
        public static List<Teil> getAktuellerLagerbestand(List<Teil> pTeil, int pNr)
        {
            List<Teil> tblTeile = new List<Teil>();
            var test = from t in App.alleProdukte[pNr]
                       group t by new { t.TeilNr, t.Bezeichnung, t.Gleichteil}
                           into g
                           select new
                           {
                               TeilNr = g.Key.TeilNr,
                               Bezeichung = g.Key.Bezeichnung,
                               Gleichteil = g.Key.Gleichteil,
                               Lagermenge = g.Select(t => t.Lagermenge).Distinct().Sum()
                           };

            foreach (var g in test)
            {
                Teil tl = new Teil();
                tl.TeilNr = g.TeilNr;
                tl.Bezeichnung = g.Bezeichung;
                tl.Lagermenge = g.Lagermenge;
                tl.Gleichteil = g.Gleichteil;
                tblTeile.Add(tl);
            }

            return tblTeile;
        }

        public static List<Teil> getAktuellerLagerbestandAlleProdukte(List<List<Teil>> plstlstTeil)
        {
            List<Teil> tblTeile = new List<Teil>();
            List<Teil> tblTeile2 = new List<Teil>();

            foreach (List<Teil> lstTeil in plstlstTeil) { 
                foreach(Teil tl in lstTeil){
                    tblTeile.Add(tl);
                }
                
            }
            
            var test1 = from t in tblTeile
                        group t by new { t.TeilNr, t.Bezeichnung, t.Gleichteil }
                           into g
                           select new
                           {
                               TeilNr = g.Key.TeilNr,
                               Bezeichung = g.Key.Bezeichnung,
                               Gleichteil = g.Key.Gleichteil,
                               Lagermenge = g.Select(t => t.Lagermenge).Distinct().Sum()
                           };

            foreach (var g in test1)
            {
                Teil tl = new Teil();
                tl.TeilNr = g.TeilNr;
                tl.Bezeichnung = g.Bezeichung;
                tl.Lagermenge = g.Lagermenge;
                tl.Gleichteil = g.Gleichteil;
                tblTeile2.Add(tl);
            }
            return tblTeile2;
        }


        public static List<Bestellung> getDistinctBestellung(List<Bestellung> plstBestellung)
        {
            List<Bestellung> lstBestellungDistinct = new List<Bestellung>();
            var test1 = (from b in plstBestellung
                         group b by new {b.BestellNr}
                         into g
                            select new
                            {
                                BestellNr = g.Key.BestellNr
                            }).Distinct();


            foreach (var g in test1)
            {
                Bestellung b = new Bestellung(g.BestellNr,null,0);
                lstBestellungDistinct.Add(b);
            }

            return lstBestellungDistinct;
        }

        public static List<Bestellposition> getBestellPosZuBestellungID(List<Bestellposition> lstBps, int pIDBestellung) {
            List<Bestellposition> lstBpsZuBestellung = new List<Bestellposition>();
            var test1 = from bps in lstBps
                         where bps.IdBestellung==pIDBestellung
                         select bps;

            foreach (var g in test1) {
                Bestellposition bp = new Bestellposition(g.Teil.TeilNr, g.Menge, g.Modus, g.LieferPeriode,g.IdBestellung,g.Positionskosten);
                lstBpsZuBestellung.Add(bp);
            
            }
            return lstBpsZuBestellung;
        }

        public static TreeViewItem getStuecklisteAlsBaum(Teil pTeil, TreeViewItem itParent)
        {
            itParent.Header = pTeil.TeilNr;

            for(int i=0;i < pTeil.lstZuordnung.Count;i++){
                TreeViewItem itChild = new TreeViewItem();
                itChild.Header = pTeil.lstZuordnung[i].TeilNr;
                itParent.Items.Add(itChild);
                getStuecklisteAlsBaum(pTeil.lstZuordnung[i],itChild);
            }

            return itParent;
        }

        public static List<int> getStuecklisteBaumMenge(Teil pTeil, List<int> pLagermenge) {
            pLagermenge.Add(pTeil.Lagermenge);
            foreach (Teil t in pTeil.lstZuordnung) {
                getStuecklisteBaumMenge(t, pLagermenge);
            }
            return pLagermenge;
        }

        public static List<Teil> getAktuellerLagerbestandAlleKaufteile(List<List<Teil>> plstlstTeil)
        {
            List<Teil> tblTeile = new List<Teil>();
            List<Teil> tblTeile2 = new List<Teil>();

            foreach (List<Teil> lstTeil in plstlstTeil)
            {
                foreach (Teil tl in lstTeil)
                {
                    tblTeile.Add(tl);
                }

            }

            var test1 = from t in tblTeile where t.Teileart == 'K'
                        group t by new { t.TeilNr, t.Bezeichnung, t.Diskontmenge, t.Bestellkosten, t.Lieferzeit, t.Lieferzeitabweichung, t.Preis}
                            into g
                            select new
                            {
                                TeilNr = g.Key.TeilNr,
                                Bezeichung = g.Key.Bezeichnung,
                                Verwendungsmenge = g.Select(t => t.Stuecklistenmenge).Distinct().Sum(),
                                Diskontmenge =g.Key.Diskontmenge,
                                Bestellkosten = g.Key.Bestellkosten,
                                Lieferzeit = g.Key.Lieferzeit,
                                Lieferzeitabweichung = g.Key.Lieferzeitabweichung,
                                Preis = g.Key.Preis,
                                Lagermenge = g.Select(t => t.Lagermenge).Distinct().Sum()
                            };

            foreach (var g in test1)
            {
                Teil tl = new Teil();
                tl.TeilNr = g.TeilNr;
                tl.Stuecklistenmenge = g.Verwendungsmenge;
                tl.Diskontmenge = g.Diskontmenge;
                tl.Bestellkosten = g.Bestellkosten;
                tl.Lieferzeit = g.Lieferzeit; 
                tl.Lieferzeitabweichung = g.Lieferzeitabweichung;
                tl.Lagermenge = g.Lagermenge;
                tl.Preis = g.Preis;
                tblTeile2.Add(tl);
            }

            return tblTeile2;
        }

        public static List<Teil> getMengenverwaltungProdFuerSicherheitsb(List<List<Teil>> plstlstTeil) {

            List<Teil> lstUngrouped = new List<Teil>();
            List<Teil> lstGrouped = new List<Teil>();
            foreach (List<Teil> lstTeil in plstlstTeil) { 
            
                foreach(Teil t in lstTeil){
                    lstUngrouped.Add(t);
                }
            
            }

            var test1 = from t in lstUngrouped
                        group t by new { t.TeilNr, t.Bezeichnung,t.Sicherheitsbestand}
                            into g
                            select new
                            {
                                TeilNr = g.Key.TeilNr,
                                Bezeichung = g.Key.Bezeichnung,
                                Sicherheitsbestand=g.Key.Sicherheitsbestand
                            };

            foreach (var g in test1)
            {
                Teil tl = new Teil();
                tl.TeilNr = g.TeilNr;
                tl.Bezeichnung = g.Bezeichung;
                tl.Sicherheitsbestand = g.Sicherheitsbestand;
                lstGrouped.Add(tl);

            }
            return lstGrouped;
        
        }
    }
}
